/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package grest.model;
import java.util.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author rodrigo
 */
public class Reservas implements Entidad{
    
       private Integer NRO_RESERVA;
       private java.util.Date FECHA;
       private java.sql.Time HORA;
       private String ESTADO;
       private Integer CANT_PERSONAS;
       private Integer NRO_CLIENTE;
       private boolean changed;
       private boolean prechanged = false; 
       
       /**
        * constructor de una reserva
        */
       public Reservas()
       {
           this(0,new Date(Calendar.YEAR,Calendar.MONTH,Calendar.DATE),new java.sql.Time(Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND),"IN",1,1);
       }
       
       /**
        * constructor de una reserva
        * @param rs
        * @throws SQLException 
        */
       public Reservas(ResultSet rs) throws SQLException {
        // valores para un nuevo objeto Test
        this.setNroReserva(rs.getInt("nro_reserva"));
        this.setFecha(java.sql.Date.valueOf(rs.getString("fecha")));
        this.setHora(java.sql.Time.valueOf(rs.getString("hora")));
        this.setEstado(rs.getString("estado"));
        this.setCantidadPersonas(rs.getInt("cant_personas"));
        this.setNroCliente(rs.getInt("nro_cliente"));
        setChanged(false);
    }
       
       /**
        * Constructor de una reserva
        * @param nroReserva
        * @param fecha
        * @param Hora
        * @param Estado
        * @param CantPersonas
        * @param Nrocliente 
        */
       public Reservas(Integer nroReserva, Date fecha, java.sql.Time Hora, String Estado, Integer CantPersonas, Integer Nrocliente)
       {
           Calendar c = new GregorianCalendar();
           this.setCantidadPersonas(CantPersonas);
           this.setNroReserva(nroReserva);
           this.setFecha(new Date(c.get(Calendar.YEAR)-1900, c.get(Calendar.MONTH), c.get(Calendar.DATE)));
           this.setHora(new Time(c.get(Calendar.HOUR), c.get(Calendar.MINUTE), c.get(Calendar.SECOND)));
           this.setEstado(Estado);
           this.setNroCliente(Nrocliente);
           setChanged(false);
           
       }
       
       
       
       /**
        * metodo setter que permite establecer un numero de cliente
        * asociado a una reserva determinada
        * @param Nro 
        */
       public void setNroCliente(Integer Nro)
       {
           ResultSet r = DataIO.getResultSet("SELECT COUNT(*) FROM T_CLIENTES WHERE NRO_CLIENTE=" + Nro);
           try{
               r.next();
               Integer c= r.getInt("COUNT");
               if(c>0){
                   this.NRO_CLIENTE=Nro;
                   setChanged(true);
               }else{
                   this.NRO_CLIENTE=1;
                   JOptionPane.showMessageDialog(null, "No existe el cliente ingresado", "Error", JOptionPane.ERROR_MESSAGE);
               }

           }catch(SQLException e){
               
           }
       }
       
       
       /**
        * metodo setter que establece la cantidad de personas 
        * asociadas a una resrva
        * @param Cant 
        */
       public void setCantidadPersonas(Integer Cant)
       {
           this.CANT_PERSONAS=Cant;
           setChanged(true);
       }
       /**
        * metodo setter que establece el estado de una reserva
        * @param estado 
        */
       public void setEstado(String estado)
       {
           this.ESTADO=estado;
           setChanged(true);
           
       }
       
       /**
        * metodo setter que establece la hora en que se realiza una reserva
        * @param hora 
        */
       public void setHora(Time hora)
       {
           this.HORA=hora;
           setChanged(true);
       }
       
       /**
        * metodo setter que establece la fecha en que se realiza una reserva
        * @param fecha 
        */
       public void setFecha(java.util.Date fecha)
       {
           this.FECHA=fecha;
           setChanged(true);
       }
       
       /**
        * metodo setter que establece el numero de reserva
        * @param nro 
        */
       public void setNroReserva(Integer nro)
       {
           this.NRO_RESERVA=nro;
           setChanged(true);
       }
       
       
       /**
        * metodo getter que devuelve el numero de cliente 
        * que esta asociado a una reserva determinada
        * @return integer 
        */
       public int getNroCliente()
       {
           return NRO_CLIENTE;
       }
       
       /**
        * metodo getter que devuelve la cantidad de personas 
        * que estan asociadas a una reserva
        * @return integer 
        */
       public int getCantPersonas()
       {
           return CANT_PERSONAS;
       }
       
    /**
        * metodo getter que devuelve el estado de una reserva determinada
        * @return String 
        */
       public String getEstado()
       {
           return ESTADO;
       }
       
       /**
        * metodo getter que devuelve la hora en que se hizo la reserva
        * @return Time 
        */
       public String getHora()
       {
           return HORA.toString();
       }
       
       /**
        * metodo getter que devuelve la fecha en que se hizo la reserva
        * @return DATE 
        */
       public String getFecha()
       {
           return FECHA.toString();
       }
       
       
       /**
        * metodo getter que devuelve el nro de reserva de la reserva
        * @return INTEGER 
        */
    public int getNroReserva()
    {
        return NRO_RESERVA;
        
    }
    
    
       
    public int getColumnCount()
    {
        return 6;
    }
    
    /**
     * ver Entidad para mas informacion
     * @param c
     * @return 
     */
    
    
    
    
    
    public Class getColumnClass(int c)
    {
        switch(c) {
            case 0:
                return Integer.class;
            case 1:
                return String.class;
            case 2:
                return String.class;
            case 3:
                return String.class;
            case 4:
                return Integer.class;
            case 5:
                return Integer.class;
            case 6:
                return Integer.class;
        }
        return null;
        
    }
    
    
    /**
     * ver documentacion en clase entidad
     * @return boolean 
     */
    
    @Override
    public boolean isChanged()
    {
        return changed;
        
    }
    
    /**
     * ver documentacion en clase entidad
     */
    @Override
    public void setChanged(boolean f)
    {
     if(!prechanged)changed=f;   
    }

    /**
     * ver documentacion en clase entidad
     * @param columna
     * @return boolean 
     */
    @Override
    public boolean isColumnEditable(int col)
    {
        switch(col) {
            case 0:
                return false;
            case 1:
                return true;
            case 2:
                return true;
            case 3:
                return false;
            case 4:
                return true;
            case 5:
                return true;
            
        }
        return false;
    }
    
    /**
     * ver documentacion en clase entidad
     * @param columna
     * @return String
     */
    @Override
    public String getColumnTitle(int c)
    {
       switch(c) {
            case 0:
                return "NRO_RESERVA";
            case 1:
                return "FECHA";
            case 2:
                return "HORA"; 
            case 3:
                return "ESTADO";
            case 4:
                return "CANT_PERSONAS";
            case 5:
                return "NRO_CLIENTE";
    }
       return null;
    }
    
    
    /**
     * ver documentacion en clase entidad
     * @param tipoEntidad
     * @param fila
     * @param columna
     * @return Objeto de la columna que corresponda 
     */
    @Override
    public Object getColumnValue(List<Entidad> e,int row,int col)
    {
        switch(col) {
            case 0:
                return ((Reservas) e.get(row)).getNroReserva();
            case 1:
                return ((Reservas) e.get(row)).getFecha();
            case 2:
                return ((Reservas) e.get(row)).getHora();
            case 3:
                return ((Reservas) e.get(row)).getEstado();
            case 4:
                return ((Reservas) e.get(row)).getCantPersonas();
            case 5:
                return ((Reservas) e.get(row)).getNroCliente();

        }
        return null;
    }
    
    
    
    
    
    /**
     * ver documentacion en clase entidad
     * @param e
     * @param row
     * @param col
     * @param value 
     */
    @Override
    public void setColumnValue(List<Entidad> e,int row,int col,Object value) {
        switch(col) {
            case 0:
                ((Reservas) e.get(row)).setNroReserva((Integer) value);
                break;
            case 1:
                try{
                    ((Reservas) e.get(row)).setFecha(java.sql.Date.valueOf((String) value));
                }catch(NumberFormatException ex){
                    JOptionPane.showMessageDialog(null, "Error al convertir el valor","Error",JOptionPane.INFORMATION_MESSAGE);
                }
                break;
            case 2:
                try{
                    ((Reservas) e.get(row)).setHora(java.sql.Time.valueOf((String) value));
                }catch(NumberFormatException ex){
                    JOptionPane.showMessageDialog(null, "Valor incorrecto","Error",JOptionPane.INFORMATION_MESSAGE);
                }catch(IllegalArgumentException ex){
                    JOptionPane.showMessageDialog(null, "Valor incorrecto","Error",JOptionPane.INFORMATION_MESSAGE);
                }
                break;
            case 3:
                ((Reservas) e.get(row)).setEstado((String) value);
                break;
            case 4:
                ((Reservas) e.get(row)).setCantidadPersonas(Integer.parseInt(value.toString()));
                break;
            case 5:
                ((Reservas) e.get(row)).setNroCliente(Integer.parseInt(value.toString()));
                break;
        }
    }
    
    /**
     * ver documentacion en clase entidad
     * @param e
     * @param tuplas 
     */
    @Override
    public void loadTuplas(List<Entidad> e, ResultSet tuplas)
    {
        try {
            e.add(new Reservas(tuplas));
        } catch (SQLException ex) {
            Logger.getLogger(Reservas.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /**
     * Metodo de Interfase Entidad, ver Entidad para mas info
     */
    @Override
    public String getDeleteQuery() {
        //return "delete from t_reservas where nro_reserva = " + getNroReserva();
        return "update t_reservas set estado='CA' where nro_reserva=" + getNroReserva();
    }
    
    /**
     * Metodo de Interfase Entidad, ver Entidad para mas info
     */
    @Override
    public String getUpdateQuery()
    {
        
        
        return "update t_reservas set cant_personas = "+this.getCantPersonas()+",estado = '"+this.getEstado()+"' where id = " + this.getNroReserva();
        
    }
    
    
    /**
     * Metodo de Interfase Entidad, ver Entidad para mas info
     */
    
    @Override
    public String getInsertQuery()
    {      
        return "insert into t_reservas values("+this.getNroReserva()+",'"+this.FECHA+"','"+this.HORA.toString()+"','"+this.getEstado()+"',"+this.getCantPersonas()+","+this.getNroCliente()+")";
    }
    
    
    /**
     * consulta que devuelve todos los atributos de la tabla reservas como un string
     * @return String
     */
    @Override
    public String getSelectQuery() {
        Calendar c = new GregorianCalendar();
        c.add(Calendar.DATE, -1);
        java.sql.Date fechaActualMenosUno = new Date(c.get(c.YEAR)-1900, c.get(c.MONTH), c.get(c.DATE));
        return "select * from t_reservas where estado='IN' AND fecha between '" +fechaActualMenosUno+"'and '" +grest.GRest.getDiasMostrarReserv()+"'"  ;
    }

    @Override
     public void setPreChanged(boolean p){
        prechanged=p;
    }
    
    @Override
     public boolean isPreChanged()
    {
        return prechanged;
    }

    @Override
    public String onPreInsertQuery() {
        return "SELECT GEN_ID( GN_T_RESERVAS, 1 ) FROM RDB$DATABASE";
    }
    
    @Override
    public void setID(Object value){
        this.NRO_RESERVA=(Integer)value;
    }

    
}